/**
 * 字符串中间星号
 * @returns 字符串
 */
export function stringStar(value = '默认内容', characters = '****', start = 3, end = 4) {
  const reg = new RegExp(`^(.{${start}}).*(.{${end}})$`)
  if (value)
    return value.replace(reg, `$1${characters}$2`)

  return ''
}

/**
 * 随机数
 * @param min 最小值
 * @param max 最大值
 * @returns number
 */
export function numberRandom(min: number, max: number) {
  return Math.floor(Math.random() * (max - min)) + min
}

/**
 * 格式化文件大小
 * @param filesize 文件大小
 * @param Bytes bytes单位
 * @param decimalPoint 小数点
 * @returns number
 */
export function formatFileSize(filesize: number, Bytes = 1024, decimalPoint = 2) {
  const format = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  if (filesize === 0)
    return `0${format[0]}`
  const i = Math.floor(Math.log(filesize) / Math.log(Bytes))
  return Number.parseFloat((filesize / Bytes ** i).toFixed(decimalPoint)) + format[i]
}

/**
 * 秒 转 时长
 * @param value  秒
 * @param dateFormat 格式 默认 hh:mm:ss
 * @returns string
 */
export function formatDuration(value, dateFormat = 'hh:mm:ss') {
  let hour: any = Number.parseInt((value / 3600).toString())
  // 时
  if (hour < 10)
    hour = `0${hour}`
  let minute: any = Number.parseInt(((value % 3600) / 60).toString())
  // 分
  if (minute < 10)
    minute = `0${minute}`
  let second: any = Math.ceil(value % 60)
  // 秒
  if (second < 10)
    second = `0${second}`
  switch (dateFormat) {
    case 'hh:mm':
      return `${hour}:${minute}`
    case 'mm:ss':
      return `${minute}:${second}`
    case 'hh':
      return hour
    default:
      if (hour > 0)
        return `${hour}:${minute}:${second}`
      else
        return `${minute}:${second}`
  }
}

/**
 * 获取 blob
 * @param  {string} url 目标文件地址
 * @return {Promise}
 */
export function getBlob(url) {
  return new Promise((resolve) => {
    const xhr = new XMLHttpRequest()
    // 避免 200 from disk cache
    url = `${url}?r=${Math.random()}`
    xhr.open('GET', url, true)
    xhr.responseType = 'blob'
    xhr.onload = () => {
      if (xhr.status === 200)
        resolve(xhr.response)
    }
    xhr.send()
  })
}

/**
 * 根据剩余的毫秒时间，得出该有天，小时，分钟等的值，返回一个对象
 * @param time 时长 单位 ms
 * @returns {object} 对象
 */
export function parseTimeData(time: number) {
  const days = Math.floor(time / (24 * 60 * 60 * 1000))
  const hours = Math.floor((time % (24 * 60 * 60 * 1000)) / (60 * 60 * 1000))
  const minutes = Math.floor((time % (60 * 60 * 1000)) / (60 * 1000))
  const seconds = Math.floor((time % (60 * 1000)) / 1000)
  const milliseconds = Math.floor(time % 1000)
  return { days, hours, minutes, seconds, milliseconds }
}

/**
 * 时间格式转换
 * @param time 时长 单位 ms
 * @param format 格式
 * @param repair 是否补0
 * @returns string
 */
export function parseTime(time: number, format = 'd:h:m:s:ms', repair = true) {
  const formatType = format.split(':')
  const { days, hours, minutes, seconds, milliseconds } = parseTimeData(time)
  const times = [days, hours, minutes, seconds, milliseconds]
  formatType.forEach((item, index) => {
    if (format.includes(item)) {
      if (times[index] > 0) {
        // 例如： 有小时没有天的时候 小时不补0
        if (index !== 0 && times[index - 1] > 0) {
          const data = repair ? padZero(times[index]) : times[index]
          format = format.replace(item, data + item)
        }
        else {
          format = format.replace(item, times[index] + item)
        }
      }
      else {
        format = format.replace(item, '')
      }
    }
  })
  return format.replace(/:/g, '')
}

/**
 * 剩余时间格式转换
 * @param time 时长 单位 ms
 * @param format 格式
 * @returns string
 */
export function parseFormat(time: number, format = 'DD:HH:mm:ss:ms') {
  let { days, hours, minutes, seconds, milliseconds } = parseTimeData(time)
  days = Number(days)
  // 如果格式化字符串中不存在DD(天)，则将天的时间转为小时中去
  if (!format.includes('DD')) {
    hours += days * 24
  }
  else if (days > 0) {
    format = format.replace('DD', padZero(days))
  }
  else {
    format = format.replace('DD:', '')
    format = format.replace('DDday', '')
    hours += days * 24
  }
  // 其他同理于DD的格式化处理方式
  if (!format.includes('HH')) {
    minutes += hours * 60
  }
  else if (hours > 0) {
    format = format.replace('HH', padZero(hours))
  }
  else {
    format = format.replace('HH:', '')
    format = format.replace('HHhour', '')
    minutes += hours * 60
  }
  if (!format.includes('mm'))
    seconds += minutes * 60
  else
    format = format.replace('mm', padZero(minutes))

  if (!format.includes('ss'))
    milliseconds += seconds * 1000
  else
    format = format.replace('ss', padZero(seconds))

  if (format.includes('ms'))
    format = format.replace('ms', padZero(milliseconds))

  return format
}
